package com.ccsoft.thread.service;

import ch.qos.logback.core.util.TimeUtil;

import java.util.concurrent.TimeUnit;

/**
 * 2021年12月8日 16:45:52 chanchaw
 * 通过案例讲解 volatile 和 DCL方法创建单例
 *
 * 声明 running 时前面没有 volatile 的话，测试代码中由于将将对象包裹在新创建的线程中
 * 导致 running 不可见，后面设置其为 false 的代码无效（volatile保证线程可见性）
 * 当声明 running 时添加 volatile 时测试代码中设置为 false 的代码就有效了。
 */
public class No4DCL {
    volatile boolean running = true;
    void m()  {
        if( running ) System.out.println("m start");
        while (running){
            //TimeUnit.MILLISECONDS.sleep(10);
        }
        if( running ) System.out.println("m start - after while");
        else System.out.println("m end");
    }

    public static void main(String[] args) {
        No4DCL inst = new No4DCL();
        new Thread(inst::m,"t1").start();
        try {
            TimeUnit.MILLISECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        inst.running = false;
    }
}
